#include "widget.h"
#include "ui_widget.h"

#include <QDebug>
#include <QResizeEvent>
#include <QTimer>
#include <thread>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //1
    ui->label_1_plain->setTextFormat(Qt::PlainText);
    ui->label_1_plain->setText("# 这是一段纯文本");

    ui->label_1_rich->setTextFormat(Qt::RichText);
    ui->label_1_rich->setText("<b>这是一段富文本</b>");

    ui->label_1_markdown->setTextFormat(Qt::MarkdownText);
    ui->label_1_markdown->setText("## 这是一段markdown文本");

    //2
    QRect windowRect = this->geometry();
    ui->label_2->setGeometry(0, 0, 0.5*windowRect.width(), 0.5*windowRect.height());

    QPixmap pixmap(":/1.jpg");
    ui->label_2->setPixmap(pixmap);
    //启动自动拉伸，就可以填充整个窗口了
    ui->label_2->setScaledContents(true);

    //3
    //对齐方式
    ui->label_3_right->setText("这是一段文本");
    ui->label_3_right->setAlignment(Qt::AlignRight | Qt::AlignTop);//按位或运算

    //自动换行
    ui->label_3_wrap->setText("这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本");
    ui->label_3_wrap->setWordWrap(true);
    ui->label_3_wrap->setIndent(50);//设置全文每行缩进

    ui->label_3_margin->setText("这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本");
    ui->label_3_margin->setWordWrap(true);
    ui->label_3_margin->setMargin(30);//设置边距

    //4
    //设置伙伴
    ui->label_4_A->setBuddy(ui->radioButton_41);
    ui->label_4_B->setBuddy(ui->radioButton_42);
    /*****************************
     * Qt中，QLabel中写的文本，可以指定快捷键(功能比QPushButton弱)
     * 在文本中使用&加一个字符来表示快捷键
     * &A -> alt + a
     * 绑定伙伴关系后，通过快捷键可以选中对应的单选按钮/复选按钮
     *******************************/

    //LCD Number
    ui->lcdNumber_1->display(10);

    //倒计时
    timer = new QTimer(this);

    connect(timer, &QTimer::timeout, this, &Widget::handle);
    //启动定时器，参数是触发timeout的周期，单位是ms
    timer->start(1000);

    //LCDNumber2

    /* 先完成构造，在显示，这种方法会导致无法显示
     * int value = ui->lcdNumber_2->intValue();
    while(true){
        //先休眠1s
        std::this_thread::sleep_for(std::chrono::seconds(1));
        if(value<=0) break;
        value -= 1;
        ui->lcdNumber_2->display(value);
    }
    */

    std::thread t([this](){
        int value = this->ui->lcdNumber_2->intValue();
        while(true){
            std::this_thread::sleep_for(std::chrono::seconds(1));
            if(value<=0) break;
            value -= 1;
            //ui->lcdNumber_2->display(value);
            //对于GUI来说，内部包含了很多的隐藏状态，Qt为了保证修改界面的过程中，线程安全是不会受到影响的，Qt禁止了其他线程直接修改界面
            //因此Qt为了确保线程安全，直接要求所有对界面的修改操作，必须在主线程完成修改
            //对于Qt的槽函数来说，默认情况下都是由主线程调用的，在槽函数修改界面灭有问题
        }
    });


}

Widget::~Widget()
{
    delete ui;
}

//此处的形参包含触发resize事件这一时刻，窗口的尺寸数值
void Widget::resizeEvent(QResizeEvent *event)
{
    qDebug() << event->size();
    ui->label_2->setGeometry(0, 0, 0.5*event->size().width(), 0.5*event->size().height());
}

void Widget::handle()
{
    //先拿到LCdNumber中的数字
    int value = ui->lcdNumber_1->intValue();
    qDebug() << value;
    if(value <= 0){
        //数字减到0，停止计时
        timer->stop();
        return;
    }

    ui->lcdNumber_1->display(value-1);
}





